import pymysql
import base64

# 密码操作
from flask_bcrypt import Bcrypt

DB_HOST = '192.168.14.93' # ip
DB_USER = 'root' # 用户名
DB_PASSWORD = 'abc123' # 密码
DB_NAME = 'model_db' # 数据库
FILE_SAVE_PATH = r'D:/python_project/uu/flask_serve/static' # 静态路径地址
FILE_DELETE_PATH = r'D:/python_project/uu/flask_serve' # 列表图片数据入库路径删除地址
bcrypt = Bcrypt()  # 加密配置



# SQLAlchemy数据库配置
class Config(object):
    """配置参数"""
    # sqlalchemy的配置参数
    SQLALCHEMY_DATABASE_URI = "mysql+pymysql://{}:{}@{}:3306/{}".format(DB_USER,DB_PASSWORD,DB_HOST,DB_NAME)

    # 设置sqlalchemy自动更新跟踪数据库
    SQLALCHEMY_TRACK_MODIFICATIONS = True


# 数据库类配置
class MySQL:
    """ mysql类 """

    def __init__(self):
        """ 连接数据库 """
        try:
            self.conn = pymysql.connect(host=DB_HOST,
                                        user=DB_USER,
                                        password=DB_PASSWORD,
                                        database=DB_NAME,
                                        charset='utf8',
                                        cursorclass=pymysql.cursors.DictCursor)
        # 出现异常时执行的代码
        except Exception as e:
            print(e)
        # 没有异常时执行的代码
        else:
            print(" * Database connection succeeded!")
            # 获取游标
            self.cursor = self.conn.cursor()

    def insert(self, sql):
        """
        插入方法
        :param sql:
        :return:
        """

        # 执行sql语句
        self.cursor.execute(sql)
        # 提交sql
        self.conn.commit()

        return "insert ok"

    def delete(self, sql):
        """
        删除
        :param sql:
        :return:
        """
        # 执行sql语句
        self.cursor.execute(sql)
        # 提交sql
        self.conn.commit()

        return "delete ok"

    def update(self, sql):
        """
        修改方法
        :param sql:
        :return:
        """

        # 执行sql语句
        self.cursor.execute(sql)
        # 提交sql
        self.conn.commit()

        return "update ok"

    def get_one(self, sql):
        """
        查询单个数据
        :param sql:
        :return:对象
        """

        # 执行sql语句
        self.cursor.execute(sql)
        # 获取数据
        res = self.cursor.fetchone()
        # 返回结果集
        return res

    def get_all(self, sql):
        """
        查询多个数据
        :param sql:
        :return:数据集
        """

        # 执行sql语句
        self.cursor.execute(sql)
        # 获取数据
        res = self.cursor.fetchall()
        # 返回结果集
        return res

    def __del__(self):
        """
        析构方法
        :return:
        """

        # 关闭游标
        self.cursor.close()
        # 关闭数据库链接
        self.conn.close()


# 图片转换base64方法
def return_img_stream(img_local_path):
    with open(img_local_path, 'rb') as img:
        # 使用base64进行编码
        b64encode = base64.b64encode(img.read())
        s = b64encode.decode()
        b64_encode = 'data:image/jpg;base64,%s' % s
        # print(b64_encode[0:30])
        # 返回base64编码字符串
        # print(type(b64_encode))
        return b64_encode


def convert_to_dict(item, fields):
    item_dict = {}  # 创建一个空字典，用于存储对象字段的键-值对
    for field in fields:
        # 遍历传入的字段列表
        if hasattr(item, field):
            # 使用 hasattr 函数检查对象 item 是否包含字段 field
            # 如果对象包含该字段，则为 True；否则为 False
            item_dict[field] = getattr(item, field)
            # 如果字段存在，使用 getattr 函数获取字段的值，并将其添加到字典中
    return item_dict
    # 返回包含对象字段的字典


# 序列化器
def convert_folder_to_dict_list(folder_res, fields):
    if isinstance(folder_res, list):
        # 检查输入参数 folder_res 是否为列表
        # 如果是列表，表示要处理多个对象
        # 对列表中的每个对象应用 convert_to_dict 函数
        return [convert_to_dict(item, fields) for item in folder_res]
    else:
        # 如果输入参数不是列表，表示要处理单个对象
        # 直接应用 convert_to_dict 函数来将单个对象转换为字典
        return convert_to_dict(folder_res, fields)


# 密码进行加密
def password_encryption(password):
    # 使用 bcrypt 来加密密码
    hashed_password = bcrypt.generate_password_hash(password).decode('utf-8')
    return hashed_password


# 用户登录时验证密码
def password_decryption(input_password, hashed_password):
    return bcrypt.check_password_hash(hashed_password, input_password)


# # 序列化
# def convert_folder_to_dict_list(folder_res, fields):
#     folder_dict_list = []
#
#     for folder in folder_res:
#         folder_dict = {}
#         for field in fields:
#             if hasattr(folder, field):
#                 folder_dict[field] = getattr(folder, field)
#         folder_dict_list.append(folder_dict)
#
#     return folder_dict_list


# print(return_img_stream('D:\CNTV\97\91a6b031d7a0cfdd8ec9feee03997e4.jpg'))
